There are several libraries and frameworks that expose task parallelism, many including scheduling features such as dependency and continuations. While the task-parallelism paradigm is known to be an effective and scalable approach to programming many-core hardware, there are several problems associated with using such libraries and frameworks in C++ and other imperative languages.
Cilk [Frigo et al. 1998] is an extension of C/C++, adding keywords for task creation and synchronization, and including a sophisticated task scheduler. Tasks are specified as functions which can in turn spawn other tasks. Cilk greatly simplifies the creation of task-parallel programs, however the programmer must manually handle dependency by synchronizing with parent tasks (waiting for parent tasks to complete). Cilk++ is very tightly integrated with C++ (in fact it is a superset of the language), and as such it would be difficult to automatically calculate dependency information. References and pointers in C++ mean that the compiler and runtime system can make no assumptions about the data corresponding to the inputs and outputs of tasks.